package com.jinyi.wwdeng.autodialer.utils

import android.content.Context
import android.media.MediaPlayer
import android.util.Log
import java.io.File

/**
 * 测试wav文件播放工具
 */
object WavPlayer {
    private const val TAG = "WavPlayer"

    @Volatile
    private var mediaPlayer: MediaPlayer? = null

    private val lock = Any()

    /**
     * 播放指定 wav 文件
     * @param context 上下文（会用 applicationContext 防止内存泄漏）
     * @param file 要播放的 wav 文件
     * @param onCompletion 播放完成回调（可选）
     */
    @Synchronized
    fun play(context: Context, file: File, onCompletion: (() -> Unit)? = null) {
        if (!file.exists()) {
            Log.e(TAG, "File not found: ${file.absolutePath}")
            return
        }

        synchronized(lock) {
            // 如果正在播放，先释放之前的
            releaseInternal()

            try {
                val mp = MediaPlayer()
                mediaPlayer = mp

                mp.setDataSource(file.absolutePath)
                mp.setOnPreparedListener { it.start() }
                mp.setOnCompletionListener {
                    releaseInternal()
                    onCompletion?.invoke()
                }
                mp.setOnErrorListener { _, what, extra ->
                    Log.e(TAG, "MediaPlayer error: what=$what, extra=$extra")
                    releaseInternal()
                    true
                }
                mp.prepareAsync()

            } catch (e: Exception) {
                Log.e(TAG, "play error: ${e.localizedMessage}", e)
                releaseInternal()
            }
        }
    }

    /** 停止播放并释放资源 */
    @Synchronized
    fun stop() {
        synchronized(lock) {
            releaseInternal()
        }
    }

    /** 是否正在播放 */
    fun isPlaying(): Boolean {
        return mediaPlayer?.isPlaying == true
    }

    /** 内部释放 */
    private fun releaseInternal() {
        try {
            mediaPlayer?.stop()
        } catch (_: Exception) {
        }
        try {
            mediaPlayer?.release()
        } catch (_: Exception) {
        } finally {
            mediaPlayer = null
        }
    }
}